# 元类是创建类的类,type 就是最常用的元类
# 使用 class定义一个类时，Python 底层默认使用 type 元类来创建这个类

# 使用 type 元类创建类
MyClass = type('MyClass', (), {})
# MyClass  类的名称（字符串类型）
# ()  基类的元组（可以为空）
# {}  类的属性和方法组成的字典

# 创建 MyClass 的实例
obj = MyClass()

print(type(MyClass))  #  <class 'type'>
print(type(obj))  #  <class '__main__.MyClass'>

# 除了使用 type 元类还可以自定义元类，
# 通过继承 type 类来实现，重写 __new__ 或 __init__ 方法
class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        # 在创建类之前可以对类的属性和方法进行修改
        if 'my_method' not in attrs:
            def my_method(self):
                print("This is a default method.")
            attrs['my_method'] = my_method
        return super().__new__(cls, name, bases, attrs)


# 使用自定义元类创建类
class MyClass(metaclass=MyMeta):
    pass


obj = MyClass()
obj.my_method()  # This is a default method.